package br.com.financas.service;

import java.util.ArrayList;
import java.util.List;

import br.com.financas.abstractions.IContaRepository;
import br.com.financas.abstractions.IContaService;
import br.com.financas.entity.Conta;
import br.com.financas.entity.Usuario;
import br.com.financas.repository.ContaRepository;

public class ContaService implements IContaService<Conta> {
	private List<Conta> contas;
	private IContaRepository<Conta> contaRepository;

	public ContaService() {
		contaRepository = new ContaRepository(manager);
		contas = new ArrayList<Conta>();
	}

	@Override
	public String validaInserir(Conta conta) throws Exception {
		String msgErro = null;
		
		contas = contaRepository.obterPorTitulo(conta.getTitulo(),
				conta.getUsuario());

		if (contas.size() != 0) {
			msgErro = "conta.existente";
		} else {

			contaRepository.inserir(conta);
		}

		return msgErro;

	}

	@Override
	public boolean validaDeletar(Conta conta) throws Exception {
		boolean deletado = contaRepository.deletar(conta);

		return deletado;

	}

	@Override
	public String validaAtualizar(Conta conta) {
		return null;
	}

	@Override
	public String validarAtualizarPorTitulo(Conta conta, String titulo) {
		Conta contaBD = new Conta();
		String msgErro = null;
		
		contas = contaRepository.obterPorTitulo(conta.getTitulo(),
				conta.getUsuario());

		for (int i = 0; i < contas.size(); i++) {
			contaBD.setTitulo(contas.get(0).getTitulo());
		}

		if (contas.size() != 0 && !contaBD.getTitulo().equals(titulo)) {
			msgErro = "conta.existente";
		} else {
			contaRepository.atualizar(conta);
		}

		return msgErro;
	}

	@Override
	public List<Conta> obterPorUsuario(Usuario usuario) {
		contas = contaRepository.obterPorUsuario(usuario);
		return contas;
	}

	@Override
	public List<Conta> obterTodos() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Conta obterPorId(long id) {
		return contaRepository.obterPorId(id);
	}

	@Override
	public String validarTransferir(Conta contaOrigem, Conta contaDestino, double valor) {
		String msgErro = null;
		
		double novoSaldoOrigem = contaOrigem.getSaldo() - valor;
		double novoSaldoDestino = contaDestino.getSaldo() + valor;

		msgErro = contaOrigem == contaDestino ? "conta.iguais" : msgErro;
		msgErro = contaOrigem.getSaldo() < valor ? "saldo.insuficiente" : msgErro;
		msgErro = valor <= 0 ? "valor.invalido" : msgErro;

		if (msgErro == null) {
			contaOrigem.setSaldo(novoSaldoOrigem);
			contaDestino.setSaldo(novoSaldoDestino);
			contaRepository.transferir(contaOrigem, contaDestino);
		}

		return msgErro;
	}

}
